package handlers

import (
	"context"

	"github.com/cloudwego/hertz/pkg/app"
	"github.com/cloudwego/kitex-examples/bizdemo/easy_note/cmd/api/rpc"
	"github.com/cloudwego/kitex-examples/bizdemo/easy_note/kitex_gen/notedemo"
	"github.com/cloudwego/kitex-examples/bizdemo/easy_note/pkg/constants"
	"github.com/cloudwego/kitex-examples/bizdemo/easy_note/pkg/errno"
	"github.com/hertz-contrib/jwt"
)

// QueryNote query list of note info
// 这个还是一个处理前端请求的函数
// 作用是查询笔记
func QueryNote(ctx context.Context, c *app.RequestContext) {
	//获取用户信息
	claims := jwt.ExtractClaims(ctx, c)
	userID := int64(claims[constants.IdentityKey].(float64))

	//创建一个前端body请求的封装
	var queryVar struct {
		Limit         int64  `json:"limit" form:"limit" query:"limit"`
		Offset        int64  `json:"offset" form:"offset" query:"offset"`
		SearchKeyword string `json:"search_keyword" form:"search_keyword" query:"search_keyword"`
	}
	//请求参数的映射+异常处理
	if err := c.Bind(&queryVar); err != nil {
		SendResponse(c, errno.ConvertErr(err), nil)
	}

	//参数校验
	if queryVar.Limit < 0 || queryVar.Offset < 0 {
		SendResponse(c, errno.ParamErr, nil)
		return
	}

	//封装一个rpc调用的客户端对象
	req := &notedemo.QueryNoteRequest{UserId: userID, Offset: queryVar.Offset, Limit: queryVar.Limit}

	//对参数的值进行修正
	//rpc客户端的请求参数中的SearchKey要根据前端请求中的值进行变化
	if len(queryVar.SearchKeyword) != 0 {
		req.SearchKey = &queryVar.SearchKeyword
	}
	//至此，已经封装好了rpc调用的客户端参数结构体
	//进行rpc调用
	//这边会获取三个参数，一个是所有查询到的notes，一个是总数，一个是err
	notes, total, err := rpc.QueryNotes(context.Background(), req)
	//老规矩处理err
	if err != nil {
		SendResponse(c, errno.ConvertErr(err), nil)
		return
	}
	//如果没问题，进行返回
	//注意，返回的data类型是一个map类型，key为string，value没有限制
	//constants这个包里边主要是放了一些常量字符串参数什么的
	SendResponse(c, errno.Success, map[string]interface{}{constants.Total: total, constants.Notes: notes})
}
